﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;

namespace Bluetooth_Fan.MXXX
{
    /// <summary>
    /// 提供一种把两个或者多个文件拼接在一起的方法
    /// </summary>
    static class CMXXXFile
    {
        /// <summary>
        /// 创建MXXX文件   其功能是把两个文件拼接
        /// </summary>
        /// <param name="OutFileData">结果</param>
        /// <param name="FileData">原文件数据</param>
        /// <param name="UserStr">用户自定义数据</param>
        /// <returns>返回0 成功  其它为错误信息</returns>
        public static int Creation_MxxxFile(ref byte[] OutFileData, byte[] FileData, string UserStr)
        {
            List<byte> listbyte = new List<byte>();
            UInt32 Length = 0;
            Length = (UserStr == null) ? 0 : (UInt32)Encoding.Default.GetByteCount(UserStr);  //得到自定义数据长度 4个字节
            Debug.WriteLine("自定义数据长度:" + Length);
            //添加自定义数据长度
            listbyte.Add((byte)Length);
            listbyte.Add((byte)(Length >> 8));
            listbyte.Add((byte)(Length >> 16));
            listbyte.Add((byte)(Length >> 24));
            listbyte.AddRange((UserStr == null) ? new byte[12] : Encoding.Default.GetBytes(UserStr));

            if ((listbyte.Count % 16) != 0)  //如果现在的元素的数量不为16的整数倍  则填充0X00直到为16的整数倍
            {
                int Count = 16 - listbyte.Count % 16;
                listbyte.AddRange(new byte[Count]);
            }
            //至此自定义数据头添加完成  开始添加明文数据头
            Length = (FileData == null) ? 0 : (UInt32)FileData.Length;  //得到明文数据长度 4个字节
            Debug.WriteLine("明文数据长度:" + Length);
            //添加明文数据长度
            listbyte.Add((byte)Length);
            listbyte.Add((byte)(Length >> 8));
            listbyte.Add((byte)(Length >> 16));
            listbyte.Add((byte)(Length >> 24));
            listbyte.AddRange((FileData == null) ? new byte[12] : FileData);

            if ((listbyte.Count % 16) != 0)  //如果现在的元素的数量不为16的整数倍  则填充0X00直到为16的整数倍
            {
                int Count = 16 - listbyte.Count % 16;
                listbyte.AddRange(new byte[Count]);
            }
            OutFileData = listbyte.ToArray();
            return 0;
        }

        /// <summary>
        /// 把MXXX文件拆分  拆分成原文件数据 及自定义数据
        /// </summary>
        /// <param name="All_Data">MXXX文件数据</param>
        /// <param name="filedata">拆分后的原文件数据</param>
        /// <param name="UserStr">拆分后的自定义数据</param>
        /// <returns>返回0成功 其它失败信息</returns>
        public static int Splitting_MxxxFile(byte[] All_Data, ref byte[] filedata, ref string UserStr)
        {
            UInt32 Length = BitConverter.ToUInt32(All_Data, 0);  //得到自定义文件数据长度
            Length += 4;  //还要加上4字节自定义长度数据
            Length = ((Length % 16 > 0) || (Length == 0)) ? ((Length / 16 + 1) * 16) : Length;
            if (All_Data.Length < Length)
            {
                return 1;    //格式错误
            }
            UInt32 DataLength = BitConverter.ToUInt32(All_Data, (int)(Length)); //得到原文件数据长度
            DataLength += 4;  //还要加上4字节自定义长度数据
            DataLength = ((DataLength % 16 > 0) || (DataLength == 0)) ? ((DataLength / 16 + 1) * 16) : DataLength;
            if (All_Data.Length != (Length + DataLength))
            {
                return 2;//格式错误
            }
            //至此可以知道以上为MXXX文件格式  开始拆分数据
            if (BitConverter.ToUInt32(All_Data, 0) > 0)//得到自定义文件数据长度
            {
                UserStr = Encoding.Default.GetString(All_Data, 4, (int)BitConverter.ToUInt32(All_Data, 0));   //得到自定义数据
            }
            else
            {
                UserStr = string.Empty;
            }
            DataLength = BitConverter.ToUInt32(All_Data, (int)(Length)); //得到原文件数据长度
            if (DataLength > 0)
            {
                filedata = new byte[DataLength];
                Array.Copy(All_Data, Length + 4, filedata, 0, filedata.Length);
            }
            else
            {
                filedata = null;
            }
            return 0;
        }
    }
}
